use salvo::prelude::*;
use tracing::info;

use crate::api::controller::{RpcClientMiddleware, auth_controller, role_controller};
use utils::rpc::{RpcClientManager, RpcConfig};

/// 链路追踪中间件
#[derive(Clone)]
pub struct TracingMiddleware;

#[async_trait]
impl Handler for TracingMiddleware {
    async fn handle(
        &self,
        req: &mut Request,
        depot: &mut Depot,
        res: &mut Response,
        ctrl: &mut FlowCtrl,
    ) {
        let method = req.method().as_str();
        let path = req.uri().path();
        let span = tracing::info_span!("http_request", method = method, path = path);
        let _enter = span.enter();

        info!("收到 HTTP 请求: {} {}", method, path);
        ctrl.call_next(req, depot, res).await;
    }
}

/// 健康检查接口
#[handler]
async fn health_check() -> &'static str {
    "System API Service is running"
}

/// 认证路由 - 公共接口
pub fn auth_routes() -> Router {
    Router::with_path("auth")
        // GET /api/system/auth/captcha - 获取验证码
        .push(Router::with_path("captcha").get(auth_controller::get_captcha))
        // POST /api/system/auth/login - 用户登录
        .push(Router::with_path("login").post(auth_controller::login_by_account))
}

/// 角色管理路由 - 客户端接口（只读）
pub fn role_client_routes() -> Router {
    Router::with_path("roles")
        // GET /api/system/client/roles - 获取角色列表
        .get(role_controller::get_list)
        // GET /api/system/client/roles/tree - 获取角色树
        .push(Router::with_path("tree").get(role_controller::get_role_tree))
        // GET /api/system/client/roles/:role_id - 获取角色详情
        .push(Router::with_path("<role_id>").get(role_controller::get_role_info))
}

/// 角色管理路由 - 管理员接口（完整CRUD）
pub fn role_admin_routes() -> Router {
    Router::with_path("roles")
        // GET /api/system/admin/roles - 获取角色列表
        .get(role_controller::get_list)
        // POST /api/system/admin/roles - 创建角色
        .post(role_controller::create_role)
        // GET /api/system/admin/roles/tree - 获取角色树
        .push(Router::with_path("tree").get(role_controller::get_role_tree))
        // GET /api/system/admin/roles/:role_id - 获取角色详情
        .push(Router::with_path("<role_id>").get(role_controller::get_role_info))
        // PUT /api/system/admin/roles/:role_id - 更新角色
        .push(Router::with_path("<role_id>").put(role_controller::update_role))
        // DELETE /api/system/admin/roles/:role_id - 删除角色
        .push(Router::with_path("<role_id>").delete(role_controller::delete_role))
}

/// 客户端 API 路由 - 只包含客户端可访问的接口
pub fn client_routes() -> Router {
    Router::with_path("client").push(role_client_routes())
    // 可以添加其他客户端接口...
    // .push(user_client_routes())
    // .push(menu_client_routes())
}

/// 管理员 API 路由 - 包含完整的管理功能
pub fn admin_routes() -> Router {
    Router::with_path("admin").push(role_admin_routes())
    // 可以添加其他管理员接口...
    // .push(user_admin_routes())
    // .push(menu_admin_routes())
    // .push(dept_admin_routes())
}

/// 系统 API 路由
pub fn system_routes(rpc_config: Option<RpcConfig>) -> Router {
    let config = rpc_config.unwrap_or_default();
    let manager = RpcClientManager::new(config);
    let rpc_middleware = RpcClientMiddleware::new(manager);

    Router::new()
        .hoop(TracingMiddleware)
        .hoop(rpc_middleware)
        .get(health_check)
        .push(
            Router::with_path("api/system")
                // 认证相关接口（公共）
                .push(auth_routes())
                // 客户端接口
                .push(client_routes())
                // 管理员接口
                .push(admin_routes()),
        )
}

/// 创建完整的 API 路由
pub fn create_api_routes(rpc_config: Option<RpcConfig>) -> Router {
    info!("🚀 初始化 API 路由");
    info!("📋 可用的API端点:");
    info!("  GET  /                                    - 健康检查");
    info!("  GET  /api/system/auth/captcha             - 获取验证码");
    info!("  POST /api/system/auth/login               - 用户登录");
    info!("  === 客户端接口 ===");
    info!("  GET  /api/system/client/roles             - 获取角色列表");
    info!("  GET  /api/system/client/roles/tree        - 获取角色树");
    info!("  GET  /api/system/client/roles/{{id}}        - 获取角色详情");
    info!("  === 管理员接口 ===");
    info!("  GET  /api/system/admin/roles              - 获取角色列表");
    info!("  POST /api/system/admin/roles              - 创建角色");
    info!("  PUT  /api/system/admin/roles/{{id}}         - 更新角色");
    info!("  DELETE /api/system/admin/roles/{{id}}       - 删除角色");
    info!("  GET  /api/system/admin/roles/tree         - 获取角色树");

    system_routes(rpc_config)
}
